#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
主应用程序入口
"""
import sys
import os
from datetime import datetime
from loguru import logger

# 尽早显示/更新启动提示文本（若 PyInstaller 启动闪屏已激活）
def _pyi_splash_update(text: str) -> None:
    try:
        import pyi_splash  # type: ignore
        if hasattr(pyi_splash, "is_alive") and pyi_splash.is_alive():
            pyi_splash.update_text(text)
    except ModuleNotFoundError:
        # 开发环境未安装（未由 PyInstaller 打包）时静默忽略
        pass
    except Exception as e:
        # 其他异常按原样记录，便于诊断
        logger.exception(e)

# 重型模块导入放到 main() 内，避免 Windows 多进程子进程隐式导入触发 UI

def setup_logging():
    """设置日志配置"""
    try:
        # 获取可执行文件的目录
        if hasattr(sys, '_MEIPASS'):
            # PyInstaller 打包后的临时目录
            base_dir = os.path.dirname(sys.executable)
        else:
            # 开发环境
            base_dir = os.path.dirname(os.path.abspath(__file__))
        
        # 创建logs目录
        log_dir = os.path.join(base_dir, "logs")
        if not os.path.exists(log_dir):
            os.makedirs(log_dir)
        
        # 设置日志文件名（包含日期）
        log_filename = os.path.join(log_dir, f"tgtrader_{datetime.now().strftime('%Y%m%d')}.log")
        
        # 移除默认的handler
        logger.remove()
        
        # 添加文件handler
        logger.add(
            log_filename,
            format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {name}:{function}:{line} - {message}",
            level="INFO",
            encoding="utf-8",
            rotation="1 day",  # 按天轮转
            retention="30 days",  # 保留30天
            compression="zip"  # 压缩旧日志
        )
        
        # 如果有控制台，也输出到控制台
        if sys.stdout is not None:
            logger.add(
                sys.stdout,
                format="{time:HH:mm:ss} | {level: <8} | {name}:{function}:{line} - {message}",
                level="INFO"
            )
        
    except Exception as e:
        # 如果日志配置失败，至少确保有基本的日志输出
        print(f"日志配置失败: {e}")
        logger.remove()
        # 只添加一个简单的文件日志
        try:
            logger.add("tgtrader_error.log", level="INFO")
        except:
            # 如果连这个都失败，就不使用文件日志
            pass

def main():
    """主函数"""
    try:
        # 设置日志
        setup_logging()
        logger.info("启动 TG Trader Tools...")

        # 在主进程中进行首次启动提示
        _pyi_splash_update("Starting TG Trader Tools...")

        # 在主进程中再进行重型模块导入，避免子进程导入时执行
        from plugins.futures_backtesting_plugin import FuturesBacktestingPlugin
        from plugins.slacking_off_plugin import SlackingOffPlugin
        from plugins.data_view_plugin import DataViewPlugin
        from ui.app import TgApplication
        from services.config_service import ConfigService

        # 先创建 Qt 应用，尽快显示 Qt 的 Splash（若未启用 PyInstaller Splash）
        app = TgApplication(
            sys.argv,
            app_name="TG Trader Tools",
            app_version="1.2",
            org_name="TG Trader",
        )

        # 更新启动提示文本（如有）
        _pyi_splash_update("Loading configuration...")
        try:
            app.update_splash_text("Starting TG Trader Tools...\nLoading configuration...")
        except Exception:
            pass

        # 初始化配置服务（可能稍慢，放在 Splash 之后）
        config_service = ConfigService()

        # 更新启动提示文本（如有）
        _pyi_splash_update("Initializing plugins...")
        try:
            app.update_splash_text("Starting TG Trader Tools...\nInitializing plugins...")
        except Exception:
            pass

        # 创建自定义插件实例（可能稍慢，放在 Splash 之后）
        futures_backtesting_plugin = FuturesBacktestingPlugin()
        slacking_off_plugin = SlackingOffPlugin()
        slacking_off_data_plugin = DataViewPlugin()

        # 初始化主窗口（此时 Splash 已显示）
        # 更新启动提示文本（如有）
        _pyi_splash_update("Starting UI...")
        try:
            app.update_splash_text("Starting TG Trader Tools...\nStarting UI...")
        except Exception:
            pass
        app.init_main_window(
            custom_plugins=[
                futures_backtesting_plugin,
                slacking_off_plugin,
                slacking_off_data_plugin,
            ],
            show_demo_plugins=False,
        )

        # 进入事件循环
        result = app.run()
        sys.exit(result)
        
    except Exception as e:
        # 按工作区规则：记录完整堆栈
        logger.exception(e)
        return 1


if __name__ == "__main__":
    # 兼容 Windows + PyInstaller 多进程：确保子进程安全启动
    try:
        import multiprocessing as _mp
        _mp.freeze_support()
    except Exception:
        # 冻结支持失败不影响主进程启动
        pass
    main()
